#!/usr/bin/env node

/**
 * 应用图标和资源设置脚本
 * 用于生成和配置应用图标、启动画面等资源文件
 */

const fs = require('fs')
const path = require('path')

// 图标配置
const ICON_CONFIG = {
  // 图标尺寸配置
  sizes: {
    '32x32': { width: 32, height: 32, format: 'png' },
    '128x128': { width: 128, height: 128, format: 'png' },
    '128x128@2x': { width: 256, height: 256, format: 'png' },
    'icon': { width: 512, height: 512, format: 'icns' }, // macOS
    'icon': { width: 256, height: 256, format: 'ico' }   // Windows
  },
  
  // 输出目录
  outputDir: 'src-tauri/icons',
  
  // 应用信息
  appInfo: {
    name: 'YunPo Markdown Editor',
    description: '现代化跨平台Markdown编辑器',
    version: '1.0.0',
    author: 'YunPo Team',
    website: 'https://yunpo.dev'
  }
}

class IconManager {
  constructor() {
    this.iconDir = ICON_CONFIG.outputDir
  }

  /**
   * 确保图标目录存在
   */
  ensureIconDirectory() {
    if (!fs.existsSync(this.iconDir)) {
      fs.mkdirSync(this.iconDir, { recursive: true })
      console.log(`📁 创建图标目录: ${this.iconDir}`)
    }
  }

  /**
   * 生成SVG图标
   */
  generateSVGIcon() {
    const svgContent = `<?xml version="1.0" encoding="UTF-8"?>
<svg width="512" height="512" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
  <defs>
    <!-- 渐变定义 -->
    <linearGradient id="backgroundGradient" x1="0%" y1="0%" x2="100%" y2="100%">
      <stop offset="0%" style="stop-color:#667eea;stop-opacity:1" />
      <stop offset="100%" style="stop-color:#764ba2;stop-opacity:1" />
    </linearGradient>
    
    <linearGradient id="iconGradient" x1="0%" y1="0%" x2="100%" y2="100%">
      <stop offset="0%" style="stop-color:#ffffff;stop-opacity:1" />
      <stop offset="100%" style="stop-color:#f8f9fa;stop-opacity:0.9" />
    </linearGradient>
    
    <!-- 阴影滤镜 -->
    <filter id="shadow" x="-50%" y="-50%" width="200%" height="200%">
      <feDropShadow dx="0" dy="4" stdDeviation="8" flood-color="#000000" flood-opacity="0.2"/>
    </filter>
  </defs>
  
  <!-- 背景圆角矩形 -->
  <rect x="32" y="32" width="448" height="448" rx="96" ry="96" 
        fill="url(#backgroundGradient)" filter="url(#shadow)"/>
  
  <!-- 文档图标主体 -->
  <g transform="translate(128, 96)">
    <!-- 文档背景 -->
    <rect x="0" y="0" width="256" height="320" rx="16" ry="16" 
          fill="url(#iconGradient)" stroke="none"/>
    
    <!-- 文档折角 -->
    <path d="M 208 0 L 256 48 L 208 48 Z" 
          fill="#e9ecef" opacity="0.8"/>
    
    <!-- Markdown 标记 -->
    <g transform="translate(32, 64)" fill="#495057">
      <!-- # 标题标记 -->
      <text x="0" y="32" font-family="SF Pro Display, -apple-system, sans-serif" 
            font-size="36" font-weight="bold">#</text>
      
      <!-- 文本行 -->
      <rect x="48" y="16" width="128" height="4" rx="2" fill="#6c757d"/>
      <rect x="48" y="28" width="96" height="4" rx="2" fill="#adb5bd"/>
      
      <!-- ** 粗体标记 -->
      <text x="0" y="80" font-family="SF Pro Display, -apple-system, sans-serif" 
            font-size="24" font-weight="bold">**</text>
      
      <!-- 更多文本行 -->
      <rect x="32" y="64" width="144" height="4" rx="2" fill="#6c757d"/>
      <rect x="32" y="76" width="112" height="4" rx="2" fill="#adb5bd"/>
      
      <!-- 列表标记 -->
      <circle cx="8" cy="116" r="4" fill="#495057"/>
      <rect x="24" y="112" width="120" height="4" rx="2" fill="#6c757d"/>
      
      <circle cx="8" cy="136" r="4" fill="#495057"/>
      <rect x="24" y="132" width="96" height="4" rx="2" fill="#6c757d"/>
      
      <!-- 代码块标记 -->
      <rect x="0" y="160" width="192" height="48" rx="8" fill="#f8f9fa" stroke="#dee2e6" stroke-width="1"/>
      <text x="8" y="180" font-family="SF Mono, Monaco, monospace" 
            font-size="12" fill="#495057">console.log('Hello')</text>
      <text x="8" y="196" font-family="SF Mono, Monaco, monospace" 
            font-size="12" fill="#495057">// Markdown Editor</text>
    </g>
    
    <!-- AI 助手图标 -->
    <g transform="translate(200, 240)">
      <circle cx="24" cy="24" r="20" fill="#28a745" opacity="0.9"/>
      <path d="M 16 20 L 20 24 L 32 12" stroke="white" stroke-width="3" 
            fill="none" stroke-linecap="round" stroke-linejoin="round"/>
    </g>
    
    <!-- Git 版本控制图标 -->
    <g transform="translate(200, 280)">
      <circle cx="24" cy="24" r="20" fill="#fd7e14" opacity="0.9"/>
      <path d="M 12 24 L 24 12 L 36 24 L 24 36 Z" fill="white"/>
    </g>
  </g>
  
  <!-- 底部品牌标识 -->
  <text x="256" y="460" text-anchor="middle" 
        font-family="SF Pro Display, -apple-system, sans-serif" 
        font-size="24" font-weight="300" fill="white" opacity="0.8">YunPo</text>
</svg>`

    const svgPath = path.join(this.iconDir, 'icon.svg')
    fs.writeFileSync(svgPath, svgContent)
    console.log(`✅ SVG图标已生成: ${svgPath}`)
    
    return svgPath
  }

  /**
   * 生成占位符PNG图标
   */
  generatePlaceholderPNGs() {
    console.log('📝 生成占位符PNG图标...')
    
    const sizes = ['32x32', '128x128', '128x128@2x']
    
    sizes.forEach(size => {
      const [width, height] = size.replace('@2x', '').split('x').map(Number)
      const actualWidth = size.includes('@2x') ? width * 2 : width
      const actualHeight = size.includes('@2x') ? height * 2 : height
      
      // 创建简单的PNG占位符内容（这里使用base64编码的1x1透明PNG）
      const placeholderContent = this.createPlaceholderPNG(actualWidth, actualHeight)
      
      const pngPath = path.join(this.iconDir, `${size}.png`)
      fs.writeFileSync(pngPath, placeholderContent, 'base64')
      console.log(`  ✅ ${size}.png`)
    })
  }

  /**
   * 创建占位符PNG内容
   */
  createPlaceholderPNG(width, height) {
    // 这是一个简化的PNG生成，实际项目中应该使用专业的图像处理库
    // 这里返回一个基本的透明PNG的base64编码
    return 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg=='
  }

  /**
   * 生成macOS图标文件
   */
  generateMacOSIcon() {
    console.log('🍎 生成macOS图标文件...')
    
    // 创建.icns文件的占位符
    const icnsPath = path.join(this.iconDir, 'icon.icns')
    const icnsContent = Buffer.from('icns placeholder - use iconutil to generate from iconset', 'utf8')
    
    fs.writeFileSync(icnsPath, icnsContent)
    console.log(`  ✅ icon.icns (占位符)`)
    
    // 创建说明文件
    const readmePath = path.join(this.iconDir, 'README-ICONS.md')
    const readmeContent = `# 图标文件说明

## 生成真实图标

本目录包含应用图标的占位符文件。要生成真实的图标文件，请按照以下步骤操作：

### macOS 图标 (.icns)

1. 使用 \`icon.svg\` 作为源文件
2. 使用图像编辑软件（如 Sketch、Figma）导出不同尺寸的PNG文件
3. 创建 iconset 目录结构：
   \`\`\`
   icon.iconset/
   ├── icon_16x16.png
   ├── icon_16x16@2x.png
   ├── icon_32x32.png
   ├── icon_32x32@2x.png
   ├── icon_128x128.png
   ├── icon_128x128@2x.png
   ├── icon_256x256.png
   ├── icon_256x256@2x.png
   ├── icon_512x512.png
   └── icon_512x512@2x.png
   \`\`\`
4. 使用 iconutil 生成 .icns 文件：
   \`\`\`bash
   iconutil -c icns icon.iconset
   \`\`\`

### Windows 图标 (.ico)

1. 使用在线工具或软件将PNG转换为ICO格式
2. 确保包含多个尺寸：16x16, 32x32, 48x48, 256x256

### Linux 图标

1. 使用PNG格式即可
2. 建议尺寸：128x128, 256x256, 512x512

## 推荐工具

- **在线工具**: favicon.io, convertio.co
- **macOS**: iconutil (系统自带)
- **跨平台**: ImageMagick, GIMP
- **设计工具**: Sketch, Figma, Adobe Illustrator

## 注意事项

- 图标应该在小尺寸下仍然清晰可辨
- 使用简洁的设计，避免过多细节
- 确保在不同背景下都有良好的对比度
- 遵循各平台的设计规范
`

    fs.writeFileSync(readmePath, readmeContent)
    console.log(`  ✅ README-ICONS.md`)
  }

  /**
   * 生成Windows图标文件
   */
  generateWindowsIcon() {
    console.log('🪟 生成Windows图标文件...')
    
    const icoPath = path.join(this.iconDir, 'icon.ico')
    const icoContent = Buffer.from('ico placeholder - use online converter or imagemagick', 'utf8')
    
    fs.writeFileSync(icoPath, icoContent)
    console.log(`  ✅ icon.ico (占位符)`)
  }

  /**
   * 生成应用元数据文件
   */
  generateAppMetadata() {
    console.log('📋 生成应用元数据...')
    
    const metadata = {
      name: ICON_CONFIG.appInfo.name,
      description: ICON_CONFIG.appInfo.description,
      version: ICON_CONFIG.appInfo.version,
      author: ICON_CONFIG.appInfo.author,
      website: ICON_CONFIG.appInfo.website,
      
      // 图标文件映射
      icons: {
        svg: 'icon.svg',
        png: {
          '32x32': '32x32.png',
          '128x128': '128x128.png',
          '128x128@2x': '128x128@2x.png'
        },
        macos: 'icon.icns',
        windows: 'icon.ico'
      },
      
      // 平台特定配置
      platforms: {
        macos: {
          bundleId: 'com.yunpo.markdown-editor',
          category: 'public.app-category.developer-tools',
          minimumSystemVersion: '10.13'
        },
        windows: {
          productName: 'YunPo Markdown Editor',
          companyName: 'YunPo Team',
          fileDescription: '现代化跨平台Markdown编辑器'
        },
        linux: {
          categories: ['Development', 'TextEditor', 'Office'],
          mimeTypes: ['text/markdown', 'text/x-markdown']
        }
      },
      
      // 生成信息
      generated: {
        timestamp: new Date().toISOString(),
        generator: 'setup-icons.js',
        version: '1.0.0'
      }
    }
    
    const metadataPath = path.join(this.iconDir, 'app-metadata.json')
    fs.writeFileSync(metadataPath, JSON.stringify(metadata, null, 2))
    console.log(`  ✅ app-metadata.json`)
  }

  /**
   * 验证图标文件
   */
  validateIcons() {
    console.log('🔍 验证图标文件...')
    
    const requiredFiles = [
      '32x32.png',
      '128x128.png', 
      '128x128@2x.png',
      'icon.icns',
      'icon.ico',
      'icon.svg'
    ]
    
    let allValid = true
    
    requiredFiles.forEach(file => {
      const filePath = path.join(this.iconDir, file)
      if (fs.existsSync(filePath)) {
        const stats = fs.statSync(filePath)
        console.log(`  ✅ ${file} (${stats.size} bytes)`)
      } else {
        console.log(`  ❌ ${file} - 文件不存在`)
        allValid = false
      }
    })
    
    if (allValid) {
      console.log('✅ 所有必需的图标文件都存在')
    } else {
      console.log('⚠️  部分图标文件缺失，请手动生成')
    }
    
    return allValid
  }

  /**
   * 设置图标和资源
   */
  async setup() {
    console.log('🎨 开始设置应用图标和资源...')
    console.log('=' .repeat(50))
    
    try {
      // 1. 确保目录存在
      this.ensureIconDirectory()
      
      // 2. 生成SVG图标
      this.generateSVGIcon()
      
      // 3. 生成占位符PNG图标
      this.generatePlaceholderPNGs()
      
      // 4. 生成macOS图标
      this.generateMacOSIcon()
      
      // 5. 生成Windows图标
      this.generateWindowsIcon()
      
      // 6. 生成应用元数据
      this.generateAppMetadata()
      
      // 7. 验证图标文件
      this.validateIcons()
      
      console.log('\n🎉 图标和资源设置完成!')
      console.log('\n📝 下一步:')
      console.log('1. 使用专业工具将 icon.svg 转换为高质量的 PNG 和 ICO/ICNS 文件')
      console.log('2. 替换占位符文件为真实的图标文件')
      console.log('3. 运行构建脚本测试图标效果')
      
    } catch (error) {
      console.error('\n💥 图标设置失败!')
      console.error(`错误信息: ${error.message}`)
      process.exit(1)
    }
  }
}

// 主程序入口
async function main() {
  const iconManager = new IconManager()
  await iconManager.setup()
}

// 运行主程序
if (require.main === module) {
  main().catch(error => {
    console.error('💥 图标设置脚本执行失败:', error)
    process.exit(1)
  })
}

module.exports = { IconManager, ICON_CONFIG }